/****************************************************************************\
 * @file     BR_RemoteController.h
 * @author   傅帅
 * @date     2019/12/30
 * @brief    遥控器
 ******************************************************************************
 * @attent
 ****************************************************************************/

#ifndef BR_REMOTE_CONTROLLER_H
#define BR_REMOTE_CONTROLLER_H

#include "stdint.h"
#include "FreeRTOS.h"
#include "task.h"

/* FreeRTOS配置 */
#define BR_RemoteControllerHandlerTaskPrio 5
#define BR_RemoteControllerHandlerTaskStkSize 512
#define BR_RemoteControllerPosterTaskPrio 6
#define BR_RemoteControllerPosterTaskStkSize 512
/* 其他配置 */
#define REMOTE_CONTROLLER_BAUDRATE    115200   // 波特率
#define REMOTE_CONTROLLER_TX_LEN      12       // 实际发送字节数
#define REMOTE_CONTROLLER_TX_MAX_LEN  100      // 发送最大字节数
#define REMOTE_CONTROLLER_TX_PRIO     14       // 串口发送DMA中断优先级
#define REMOTE_CONTROLLER_RX_MAX_LEN  50       // 接收最大字节数
#define REMOTE_CONTROLLER_RX_PRIO     14       // 串口接受串口中断优先级
#define BR_RC_SEND_RATE                4       // 回传信息帧发送频率

#define BR_RC_KEY1_DOWN  BR_gRobot.RemoteController.KeyData & 0x0001
#define BR_RC_KEY2_DOWN  BR_gRobot.RemoteController.KeyData & 0x0002
#define BR_RC_KEY3_DOWN  BR_gRobot.RemoteController.KeyData & 0x0004
#define BR_RC_KEY4_DOWN  BR_gRobot.RemoteController.KeyData & 0x0008
#define BR_RC_KEY5_DOWN  BR_gRobot.RemoteController.KeyData & 0x0010
#define BR_RC_KEY6_DOWN  BR_gRobot.RemoteController.KeyData & 0x0020
#define BR_RC_KEY7_DOWN  BR_gRobot.RemoteController.KeyData & 0x0040
#define BR_RC_KEY8_DOWN  BR_gRobot.RemoteController.KeyData & 0x0080
#define BR_RC_KEY9_DOWN  BR_gRobot.RemoteController.KeyData & 0x0100
#define BR_RC_KEY10_DOWN BR_gRobot.RemoteController.KeyData & 0x0200
#define BR_RC_KEY11_DOWN BR_gRobot.RemoteController.KeyData & 0x0400
#define BR_RC_KEY12_DOWN BR_gRobot.RemoteController.KeyData & 0x0800
#define BR_RC_KEY13_DOWN BR_gRobot.RemoteController.KeyData & 0x1000
#define BR_RC_KEY14_DOWN BR_gRobot.RemoteController.KeyData & 0x2000
#define BR_RC_KEY15_DOWN BR_gRobot.RemoteController.KeyData & 0x4000
#define BR_RC_KEY16_DOWN BR_gRobot.RemoteController.KeyData & 0x8000

/* 工作流枚举 */
typedef enum {
    IDLE, FLOW1
}BR_eWorkingFlow_t;

typedef struct {
    uint8_t DebugMsgSendFlag;           // 是否向遥控器发送Debug信息
    uint16_t KeyData;                   // 按键情况 [key0 to key15]
    BR_eWorkingFlow_t NextWorkingFlow;  // 由遥控器设置的下次主逻辑要跑的工作流
    float LeftJoystickDir;              // 左摇杆表示方向 [rad]
    float RightJoystickVel;             // 右摇杆表示速度 [mm/s]
}BR_RemoteController_t;

void BR_vRemoteControllerHandlerTask(void);
void BR_vRemoteControllerPosterTask(void);
void BR_vRemoteControllerInit(void);

extern TaskHandle_t BR_RemoteControllerHandlerTaskHandler;
extern TaskHandle_t BR_RemoteControllerPosterTaskHandler;
#endif
